通过Jenkins容器构建镜像(2)
作者:杨冬 欢迎转载,也请保留这段声明。谢谢!
出处:https://andyyoung01.github.io/ 或 http://andyyoung01.16mb.com/
上篇文章我们构建了一个Jenkins镜像,本篇我们通过一个实例使用一下上篇构建的镜像,来组成一个持续集成环境。典型的持续集成环境包含的功能包括:从源代码仓库拉取代码,源代码的编译,对编译后的代码进行单元测试、集成测试及系统测试等,测试完成后对代码的打包。这些功能可以通过Jenkins的插件来实现。
本篇的代码使用了“Using Docker”一书当中的identidock代码。它是由python语言编写的简单的web应用程序。程序的基本功能是根据用户输入的用户名,生成一个专属于该用户的图标,如下图所示:
完整的程序由三部分组成:一个由Flask框架编写的web程序,一个基于redis的缓存,以及一个生成图标的web服务。这三个部分都最终都通过容器提供服务,组成微服务的架构。程序的代码主要在第一个部分即web程序部分,另外两个部分都直接使用现成的容器镜像,即一个redis镜像和一个amouat/dnmonster镜像。整个程序可以通过docker-compose组成测试环境。程序的源代码在https://github.com/andyyoung01/ci-testing/tree/master/identidock。
下面我们主要关注通过上篇构建的Jenkins镜像,来拉取程序源代码,运行此程序的单元测试,在测试完成后可以通过bash脚本将程序tagging,然后推送到镜像库中等待部署。
首先,下载上篇构建的Jenkins容器镜像:
[yangdong@centos7 ~]$ docker pull registry.cn-beijing.aliyuncs.com/andyyoung01/jenkins-with-docker
为了方便持久化Jenkins容器的配置等,我们创建一个数据容器:
[yangdong@centos7 ~]$ docker run --name jenkins-data \
> registry.cn-beijing.aliyuncs.com/andyyoung01/jenkins-with-docker \
> echo "Jenkins Data Container"
Jenkins Data Container
下面创建Jenkins服务器容器,并且通过--volumes-from
命令行参数使用前面创建的数据容器,来持久化JENKINS_HOME中的数据:
[yangdong@centos7 ~]$ docker run -d -v /var/run/docker.sock:/var/run/docker.sock \
> --volumes-from jenkins-data -p 8080:8080 --name jenkins \
> registry.cn-beijing.aliyuncs.com/andyyoung01/jenkins-with-docker
4f94030e525ea573c98a8d24df2540075f5a43f091890256fb7295d137192754
容器需要一段时间初始化,此时可以通过如下命令查看容器的初始化过程:
[yangdong@centos7 ~]$ docker logs -f jenkins
...
从上面的日志输出可以查询到Jenkins服务器的初始化密码,使用此密码登录Jenkins的web界面。经过一系列的初始化后,最终进入了Jenkins的web界面。下面开始通过此web页面创建创建持续集成环境:
- 点击“创建一个新任务”链接。
- 在item name中输入项目的名称,这里输入“identidock”,然后选择“构建一个自由风格的软件项目”,点击“ok”。
- 在“源码管理”部分,选择Git,然后输入您自己的代码库的Repository URL,这里直接使用Git Hub作为代码库,输入“https://github.com/andyyoung01/ci-testing.git”。“Branches to build”输入想要构建的分支,这里保留默认的master分支。这部分配置了该持续集成环境从哪里拉取程序源代码。
- 在“构建”部分,选择“增加构建步骤”,选择“Execute shell”。在“Command”文本框中,输入下面的bash脚本:123456789101112131415161718192021222324252627282930313233343536373839404142#Enter the working directorycd identidock#Default compose argsCOMPOSE_ARGS=" -f jenkins.yml -p jenkins "#Make sure old containers are gonesudo docker-compose $COMPOSE_ARGS stopsudo docker-compose $COMPOSE_ARGS rm --force -v#build the systemsudo docker-compose $COMPOSE_ARGS build --no-cachesudo docker-compose $COMPOSE_ARGS up -d#Run unit testssudo docker-compose $COMPOSE_ARGS run --no-deps --rm -e ENV=UNIT identidockERR=$?#Run system test if unit tests passedif [ $ERR -eq 0 ]; thenIP=$(sudo docker inspect -f {{.NetworkSettings.IPAddress}} jenkins_identidock_1)CODE=$(curl -sL -w "%{http_code}" $IP:9090/monster/bla -o /dev/null) || trueif [ $CODE -eq 200 ]; thenecho "Test passed - Tagging"HASH=$(git rev-parse --short HEAD)sudo docker tag jenkins_identidock andyyoung01/identidock:$HASHsudo docker tag jenkins_identidock andyyoung01/identidock:newestecho "Pushing"# sudo docker login -u your-username -p your-password registry.cn-beijing.aliyuncs.com# sudo docker push amouat/identidock:$HASH# sudo docker push amouat/identidock:newestelseecho "Site returned " $CODEERR=1fifi#Pull down the systemsudo docker-compose $COMPOSE_ARGS stopsudo docker-compose $COMPOSE_ARGS rm --force -vreturn $ERR
上面的部分配置了持续集成环境的构建和测试部分,以及测试成功后对代码的打包。
最后点击“保存”按钮保存所有设置,回到该项目的主页后,点击左边的“立即构建”链接开始构建项目。这里是手动触发的构建,当然还有许多其它触发构建的方式可以配置。
稍微看一下上面的bash脚本。它是通过docker-compose来设置测试环境的。在运行了单元测试后,如果没有问题,继续运行系统测试。系统测试也成功后,对镜像打标签,然后推送到镜像存储库中(这里没有实际推送上去)。
在web页面的“Console Output”链接下,可以看到构建过程中的日志输出,如下图:
可见,这里我们通过bash脚本完成了大多数的持续集成步骤。实际上,Jenkins提供了许多插件,可以用来配置整个持续集成的Pipeline。